package cn.china.springbootpoiexcel.controller;

import cn.china.springbootpoiexcel.util.ExcelWaterRemarkUtils;
import cn.china.springbootpoiexcel.util.ImageUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.*;
import java.util.Random;
import java.util.UUID;

public class ExportExcelWithWaterPrintController {

    public static void main(String[] args) throws IOException {
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("成绩表");
        //为文件添加密码，设置文件只读
        sheet.protectSheet(UUID.randomUUID().toString());
        // 在sheet里创建第一行，参数为行索引(excel的行)，可以是0～65535之间的任何一个
        HSSFRow row1 = sheet.createRow(0);
        // 创建单元格（excel的单元格，参数为列索引，可以是0～255之间的任何一个
        HSSFCell cell = row1.createCell(0);
        // 设置单元格内容
        cell.setCellValue("学员考试成绩一览表");
        // 合并单元格CellRangeAddress构造参数依次表示起始行，截至行，起始列， 截至列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
        // 在sheet里创建第二行
        HSSFRow row2 = sheet.createRow(1);
        // 创建单元格并设置单元格内容
        row2.createCell(0).setCellValue("姓名");
        row2.createCell(1).setCellValue("班级");
        row2.createCell(2).setCellValue("笔试成绩");
        row2.createCell(3).setCellValue("机试成绩");
        String imgPath="./水印.png";

        // 在sheet里创建第三行
        for(int i=0;i<20;i++){
            Random random=new Random();
            HSSFRow row3 = sheet.createRow(2+i);
            row3.createCell(0).setCellValue("李明");
            row3.createCell(1).setCellValue("As178");
            row3.createCell(2).setCellValue(random.nextInt(10));
            row3.createCell(3).setCellValue(random.nextInt(10));
            row3.createCell(4).setCellValue(random.nextInt(10));
            row3.createCell(5).setCellValue(random.nextInt(10));
        }

        ImageUtils.createWaterMark("敏感词", imgPath);

        //遍历行row
        for(int rowNum = 3; rowNum<sheet.getLastRowNum();rowNum++){
            //获取每一行
            HSSFRow row = sheet.getRow(rowNum);
            if(row == null){
                continue;
            }

            //遍历列cell
            for(int cellNum = 0; cellNum<row.getLastCellNum();cellNum++){
                //获取每一列
                HSSFCell cell2 = row.getCell(cellNum);
                if(cell2 == null){
                    continue;
                }

//				System.out.print(" "+getValue(cell2));
                //敏感词 自己定义规则
                if(getValue(cell2).equals("5.0")){
                    /*
                     * 参数定义： 第一个参数是（x轴的开始节点）； 第二个参数是（是y轴的开始节点）； 第三个参数是（是x轴的结束节点）；
                     * 第四个参数是（是y轴的结束节点）； 第五个参数是（是从Excel的第几列开始插入图片，从0开始计数）；
                     * 第六个参数是（是从excel的第几行开始插入图片，从0开始计数）； 第七个参数是（图片宽度，共多少列）；
                     * 第8个参数是（图片高度，共多少行）；
                     */

                    ExcelWaterRemarkUtils.putWaterRemarkToExcel(wb, sheet, imgPath, rowNum, cellNum, rowNum-3, cellNum, cellNum, rowNum, 0, 0);

                    System.out.println(rowNum+"行,"+cellNum+"列");


                }
            }
        }


        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }
        wb.close();
        byte[] content = os.toByteArray();

        File file1 = new File("./my.xls");// Excel文件生成后存储的位置。
        OutputStream fos = null;

        try {
            fos = new FileOutputStream(file1);
            fos.write(content);
            os.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String getValue(HSSFCell cell){
        if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
            return String.valueOf(cell.getBooleanCellValue());
        }else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
            return String.valueOf(cell.getNumericCellValue());
        }

        return String.valueOf(cell.getStringCellValue());
    }

}
